//
//  ABOAuthViewController.swift
//  microblog
//
//  Created by 安波 on 15/10/28.
//  Copyright © 2015年 anbo. All rights reserved.
//

import UIKit
import SVProgressHUD

class ABOAuthViewController: UIViewController {
    
    override func loadView() {
        // 重新设置View为WebView
        view = webView
        
        // 指定代理
        webView.delegate = self
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // 在还没有重新设置View时，也没有设置View背景颜色时，modal出来的时候的动画很奇怪
//        view.backgroundColor = UIColor.blueColor()
        
        // 设置modal出来的控制器导航条上的“取消”按钮
        navigationItem.rightBarButtonItem = UIBarButtonItem(title: "取消", style: UIBarButtonItemStyle.Plain, target: self, action: "cancleButtonClick")
        // 设置modal出来的控制器导航条上的“填充按钮”
        navigationItem.leftBarButtonItem = UIBarButtonItem(title: "填充", style: UIBarButtonItemStyle.Plain, target: self, action: "stuffUserAccount")
        
        // 加载网页:   URL是通过网络单例工具类获得
        let request = NSURLRequest(URL: ABNetworkTools.sharedInstance.oauthURl())
        webView.loadRequest(request)
        
    }
    /// 监听取消按钮的点击事件
    func cancleButtonClick(){
        // 退出授权界面
        dismissViewControllerAnimated(true, completion: nil)
        
        // 关闭加载提示框
        SVProgressHUD.dismiss()
    }
    
    /// 监听填充按钮的点击事件
    func stuffUserAccount(){
//        print(__FUNCTION__)
        let js = "document.getElementById('userId').value='15079207554';" + "document.getElementById('passwd').value='*lmm520anbo';"
        
        webView.stringByEvaluatingJavaScriptFromString(js)
    }
    
    // MARK: - 懒加载
    /// 懒加载 webView
    private lazy var webView = UIWebView()
}


// MARK: - 扩展ABOAuthViewController  实现UIWebViewDelegate协议
extension ABOAuthViewController: UIWebViewDelegate {
    
    /// 开始加载请求
    func webViewDidStartLoad(webView: UIWebView) {
        // 显示正在加载
        /* 
            showWithStatus方法，若不主动关闭，会一直显示
            status参数是：提示信息
            SVProgressHUDMaskType参数是：加载时的模式
         */
        SVProgressHUD.showWithStatus("正在加载...", maskType: SVProgressHUDMaskType.Black)
        
    }
    
    /// 加载请求完毕
    func webViewDidFinishLoad(webView: UIWebView) {
        // 关闭加载
        SVProgressHUD.dismiss()
    }
    
    /// 询问是否加载request
    func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
        // 打印  加载地址  URL需要强制拆包
        let urlString = request.URL!.absoluteString
        print("urlString:\(urlString)")
        //打印出urlString:Optional("https://api.weibo.com/oauth2/authorize?client_id=296455517&redirect_uri=http://www.baidu.com/")
        
        // 判断：加载的不是回调地址时，可以加载
        if !urlString.hasPrefix(ABNetworkTools.sharedInstance.redirect_uri) {
            return true  //可以加载
        }
        
        // 判断：如果点击的是确定或取消，拦截不加载
        if let query = request.URL?.query {
            print("query:\(query)")
            // 点击取消时   地址 http://www.baidu.com/?error_uri=%2Foauth2%2Fauthorize&error=access_denied&error_description=user%20denied%20your%20request.&error_code=21330
            // 点击授权时   回调地址  urlString:Optional("http://www.baidu.com/?code=b20ada18d73d6a2e07c4d710774d1062")
            let codeString = "code="
            if query.hasPrefix(codeString) { // 截取“code=..."字符串
                // 确定  code=b20ada18d73d6a2e07c4d710774d1062
                // 将code转成NSString类型
                let nsQuery = query as NSString
                
                // 截取code的值
                let code = nsQuery.substringFromIndex(codeString.characters.count)
                print("code = \(code)")
                // 获得access_Token  （需要调用网络工具类）
                loadAccessToken(code)
                
                // 在拦截数据成功后，需要直接结束程序
                return false
            }else{
                // 取消
                
            }
        }
        
        return true
    }
    
    ///  调用网络工具去加载access_Token
    func loadAccessToken(code: String){
        // 利用网络工具（单例）类  调用它的加载access_Token方法 来加载access_Token
        ABNetworkTools.sharedInstance.loadAccessToken(code) { (result, error) -> () in
            //判断  如果 有错误 或 没有请求结果
            // 模拟“网络不给力...”效果时，修改  error == nil 即可
            if error != nil || result == nil{
//                //  提示  网络不给力
//                SVProgressHUD.showErrorWithStatus("网络不给力...", maskType: SVProgressHUDMaskType.Black)
//                
//                // 延迟关闭. dispatch_after 没有提示,可以拖oc的dispatch_after来修改
//                dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (Int64)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), { () -> Void in
//                    self.cancleButtonClick()
//                })
                self.netError("网络不给力...")
                
                return
            }
            // 判断  如果 没有错误 或 有请求结果；将结果保存
            print("result: \(result)")
            
            // 获得用户信息
            let account = ABUserAccount(dict: result!)
            
            // 将用户信息  保存到沙盒
            account.saveAccount()
            print("account:\(account)")
            
            /// 加载用户数据
            account.loadUserInfo({ (error) -> () in
                if error != nil {
                    print("加载用户数据出错...\(error)")
                    self.netError("加载用户数据出错...")
                    return
                }
            })
            
            // 关闭提示
            SVProgressHUD.dismiss()
            
            // 切换控制器
            (UIApplication.sharedApplication().delegate as! AppDelegate).switchRootController(false)
        }
    }
    
    // 错误提示
    private func netError(message: String){
        //  提示  网络不给力
        SVProgressHUD.showErrorWithStatus(message, maskType: SVProgressHUDMaskType.Black)
        
        // 延迟关闭. dispatch_after 没有提示,可以拖oc的dispatch_after来修改
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (Int64)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), { () -> Void in
            // 取消
            self.cancleButtonClick()
        })
    }
    
}
